package com.local.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * @author lou ke
 * @version 1.0
 * @since 2020/4/18 22:42
 */
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // 授权规则        authorize
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        /*
         *  ((HttpSecurity)((HttpSecurity)((AuthorizedUrl)http.authorizeRequests().anyRequest()).authenticated().and()).formLogin().and()).httpBasic();
         */

        // 首页所有人可以访问， 功能页只有对应有权限的人才能访问
        // 请求授权的规则
        /*
         * authorizeRequests : 授权请求
         * antMatchers : 添加地址
         */
        http.authorizeRequests()
                .antMatchers("/").permitAll()                   // 所有人可以访问首页
                .antMatchers("/level1/**").hasRole("vip1")      // 角色 vip1可以访问 /level1/**
                .antMatchers("/level2/**").hasRole("vip2")      // 角色 vip2可以访问 /level2/**
                .antMatchers("/level3/**").hasRole("vip3");     // 角色 vip3可以访问 /level3/**


        // 没有权限默认会到登录页面，需要开启登录的页面 ：   /login
        http.formLogin().loginPage("/toLogin");

        // 注销    开启了注销功能
        http.csrf().disable();   // 关闭
        http.logout()
                // .deleteCookies()             // 删除cookies
                // .invalidateHttpSession(false)    // 删除session
                .logoutSuccessUrl("/");       // 注销成功后跳到什么地方去：首页


        http.rememberMe();      // 开启记住我功能

    }




    // 认证规则       Authentication：认证    /  身份验证   两个意思都正确
    // 密码编码： passwordEncoder
    // 在 spring Security 5.0+ 中新增了很多的加密方法
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        /*
        inMemoryAuthentication() : 内存认证
        这些数据正常应该从数据库中读
         */
        auth.inMemoryAuthentication()
                .passwordEncoder(new BCryptPasswordEncoder())            // 密码加密规则
                .withUser("lk").password(new BCryptPasswordEncoder().encode("123")).roles("vip2", "vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("vip1", "vip2", "vip3")
                .and()
                .withUser("guest").password(new BCryptPasswordEncoder().encode("123")).roles("vip1");
    }
}
